import store from '@/store'
import { getToken } from '@/utils/userAbout'
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'

Vue.use(VueRouter)

// 二次封装 push 和 replace 解决编程式导航 路径重复提交时的promise报错
// push 和 replace 调用，返回的值是一个 promise

const oldPush = VueRouter.prototype.push
const oldReplace = VueRouter.prototype.replace

VueRouter.prototype.push = function (options, resolve, reject) {
    if (!resolve && !reject) { // 没有传回调时执行
        return oldPush.call(this, options).catch(() => { })
    } else { // 传了 1 个或者 2 个回调 时执行
        return oldPush.call(this, options, resolve, reject)
    }
}

VueRouter.prototype.replace = function (options, resolve, reject) {
    if (!resolve && !reject) {
        return oldReplace.call(this, options).catch(() => { })
    } else {
        return oldReplace.call(this, options, resolve, reject)
    }
}

const router = new VueRouter({
    routes,
    // 路由组件跳转时，视口设置在最顶端
    scrollBehavior() {
        return { y: 0 }
    }
})
// 路由导航守卫
router.beforeEach(async (to, from, next) => {
    const token = getToken('token')
    const userInfo = store.state.user.userInfo || {}
    // 有token 
    if (token) {
        // 不需要去登录页面了  默认跳去首页
        if (to.path === '/login') {
            next('/')
        } else {
            // 有用户信息
            if (userInfo.name) {
                next()
            } else { // 没有用户信息
                try {
                    // 获取用户信息
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    alert('账户信息失效，请重新登录')
                    // 清除已过期的用户信息
                    await store.dispatch('getLogout')
                    // 跳转到登录页面
                    next('/login')
                }
            }
        }
    } else { // 有token
        // 可以添加和查看购物车等
        // 限制去 trade pay paysuccess center 
        if(to.path.indexOf('/trade') !== -1 || to.path.indexOf('/pay') !== -1 || to.path.indexOf('/center') !== -1){
            next(`/login/?wantPath=${to.path}`)
        }else{
            next()
        }
    }
})

export default router